/*
* 本文件主要放通用的验证器规则，如果不是通用的就直接写在局部模块中。
*
* ============正则表达式 start============ *
* */
// 只能输入数字和字母
export const numLette = {
    test: /^[A-Za-z0-9]+$/,
    message: '只能输入数字和字母'
}

// 只能输入数字和字母和$
export const numLettes = {
    test: /^[A-Za-z0-9$]+$/,
    message: '只能输入数字和字母'
}

// 只能输入字母和下划线
export const letterUnderLine = {
    test: /^[a-zA_]{1,}$/,
    message: '只能输入字母和下划线'
}

// 只能输入字母
export const letter = {
    test: /^[a-zA]{1,}$/,
    message: '只能输入字母'
}

// 汉字验证
export const CnStr = {
    test: /^[\u4e00-\u9fa5]+$/,
    message: '只接收中文输入'
}

// 电话号码
export const telNumer = {
    test: /^[-_+0-9]*$/,
    message: '电话号码格式不正确'
}

// 手机号码
export const mobileNumber = {
    test: /^1[345789]\d{9}$/,
    message: '手机号码格式不正确'
}

// 邮箱
export const email = {
    test: /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/,
    message: '邮箱格式不正确'
}

// ip
export const ip = {
    test: /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/,
    message: 'ip地址格式不正确'
}

// port端口
export const port = {
    test: /^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-6])$/,
    message: '请输入0到65535的端口号'
}

// 验证数字
export const number = {
    test: /^[0-9]*$/,
    message: '输入有误(请输入1位数字)'
}

// 验证3位数字
export const threeBits = {
    test: /^\d{1,3}$/,
    message: '输入有误(请输入1到3位数字)'
}

// 验证1位数字
export const oneBits = {
    test: /^\d{1,1}$/,
    message: '输入有误(只能输入1位数字)'
}

export const restrictChars = [
    {ch: ',', dr: '逗号,'},
    {ch: ':', dr: '冒号:'},
    {ch: '.', dr: '点.'},
    {ch: ' ', dr: '空格'},
    {ch: '\'', dr: '单引号'},
    {ch: '"', dr: '双引号'},
    {ch: '%', dr: '百分号%'},
    {ch: '<', dr: '大于符号>'},
    {ch: '>', dr: '小于符号<'},
    {ch: '\\', dr: '斜杠\\'},
    {ch: '+', dr: '+'},
    {ch: '-', dr: '-'},
    {ch: '?', dr: '?'},
    {ch: '&', dr: '&'},
    {ch: '*', dr: '*'},
    {ch: '$', dr: '$'},
    {ch: '#', dr: '#'},
    {ch: '!', dr: '!'},
    {ch: '~', dr: '~'},
    {ch: ';', dr: ';'},
    {ch: '@', dr: '@'},
    {ch: '{', dr: '括号{'},
    {ch: '}', dr: '括号}'},
    {ch: '(', dr: '括号('},
    {ch: ')', dr: '括号)'},
    {ch: '|', dr: '竖线|'}
]
// ============正则表达式 end============

/*
* ============验证器内容 start============ *
* */
// 只能输入数字和字母
export const numLetteValidator = (rule, value, callback) => {
    if ((!value) || numLette.test.test(value)) {
        callback()
    } else {
        callback(new Error(numLette.message))
    }
}
// 只能输入数字和字母和 $
export const numLetteValidators = (rule, value, callback) => {
    if ((!value) || numLettes.test.test(value)) {
        callback()
    } else {
        callback(new Error(numLettes.message))
    }
}
// 只能输入字母和下划线
export const letterUnderLineValidators = (rule, value, callback) => {
    if ((!value) || letterUnderLine.test.test(value)) {
        callback()
    } else {
        callback(new Error(letterUnderLine.message))
    }
}
// 只能输入字母
export const letterValidators = (rule, value, callback) => {
    if ((!value) || letter.test.test(value)) {
        callback()
    } else {
        callback(new Error(letter.message))
    }
}
// 汉字验证器
export const cnValidator = (rule, value, callback) => {
    if ((!value) || CnStr.test.test(value)) {
        callback()
    } else {
        callback(new Error(CnStr.message))
    }
}
// 非汉字验证器
export const notCnValidator = (rule, value, callback) => {
    if ((!value) || !CnStr.test.test(value)) {
        callback()
    } else {
        callback(new Error('不接受汉字输入'))
    }
}
// 基础电话号码验证器
export const telNumberValidator = (rule, value, callback) => {
    if ((!value) || telNumer.test.test(value)) {
        callback()
    } else {
        callback(new Error(telNumer.message))
    }
}
// 手机号码验证器
export const mobileNumberValidator = (rule, value, callback) => {
    if ((!value) || mobileNumber.test.test(value)) {
        callback()
    } else {
        callback(new Error(mobileNumber.message))
    }
}
// 邮箱验证器
export const emailValidator = (rule, value, callback) => {
    if ((!value) || email.test.test(value)) {
        callback()
    } else {
        callback(new Error(email.message))
    }
}
// ip地址验证器
export const ipValidator = (rule, value, callback) => {
    if ((!value) || ip.test.test(value)) {
        callback()
    } else {
        callback(new Error(ip.message))
    }
}
// port端口号验证器
export const portValidator = (rule, value, callback) => {
    if ((!value) || port.test.test(value)) {
        callback()
    } else {
        callback(new Error(port.message))
    }
}
// 数字验证器
export const numberValidator = (rule, value, callback) => {
    if ((!value) || number.test.test(value)) {
        callback()
    } else {
        callback(new Error(number.message))
    }
}
// 数字3位数验证器
export const threeValidator = (rule, value, callback) => {
    if ((!value) || threeBits.test.test(value)) {
        callback()
    } else {
        callback(new Error(threeBits.message))
    }
}

export const restrictCharsValidate = (rule, value, callback) => {
    if (value) {
        for (let rc of restrictChars) {
            if (value.indexOf(rc.ch) !== -1) {
                callback(new Error(`包含非法字符${rc.dr}`))
                return
            }
        }
    }
    callback()
}
// ============验证器内容 end============

// 验证器
export default {
    numLetteValidator, // 只能输入数字和字母
    numLetteValidators, // 只能输入数字和字母和 $
    letterUnderLineValidators, // 只能输入字母和下划线
    letterValidators, // 只能输入字母
    cnValidator, // 汉字验证器
    notCnValidator, // 非汉字验证器
    telNumberValidator, // 基础电话号码验证器
    mobileNumberValidator, // 手机号码验证器
    emailValidator, // 邮箱验证器
    ipValidator, // ip地址验证器
    portValidator, // 端口验证器
    numberValidator, // 数字验证器
    threeValidator, // 数字位数验证器
    restrictCharsValidate // 限制字符验证器
}
